// #include "AnimationWidget.h"
// #include <imgui.h>
// #include <SECore/Util.h>
// #include <SEEdit/Layer/EditLayer.h>
// #include <SECore/CoreApplication.h>
// #include <SEEdit/Descriptors/SelectActorDescriptor.h>
// #include <SECore/Ecs/Actor.h>
// #include <SEngine/Ecs/Components/AnimationComp.h>

// namespace ed = ax::NodeEditor;

// namespace SEngine
// {
//     struct LinkPayload
//     {
//         int linkID;
//         int inputID;
//         int outputID;
//         LinkPayload(int inputID_, int outputID_) : inputID(inputID_), outputID(outputID_) { linkID = CreateUUID<int>(); }
//     };

//     struct NodePayload
//     {
//         std::string title{"State"};
//         int nodeID;
//         int inputID;
//         int outputID;
//         bool isEntry;
//         NodePayload(const std::string & title_, bool isEntry_ = false) : title(title_), isEntry(isEntry_) {
//             nodeID = CreateUUID<int>();
//             inputID = CreateUUID<int>();
//             outputID = CreateUUID<int>();
//         };
//     };


//     AnimationWidget::AnimationWidget(EditLayer & layer)
//         : Widget(), m_layer(layer)
//     {
//         ed::Config cfg;
//         m_editorContext = ed::CreateEditor(&cfg);
//     }

//     AnimationWidget::~AnimationWidget()
//     {
//         ed::DestroyEditor(m_editorContext);
//     }

//     void AnimationWidget::BeginUpdate()
//     {
//         ed::SetCurrentEditor(m_editorContext);
//         // ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{0.0f, 0.0f});
//     }
    
//     void AnimationWidget::UpdateImpl(int delta)
//     {
//         auto selectActorDes = m_layer.GetApp().GetDescriptor<SelectActorDescriptor>()->get();
//         if (selectActorDes.selectActor && selectActorDes.selectActor->get().HasComponent<AnimationComp>()) {
//             ed::Begin("My Editor", ImVec2(0.0, 0.0f));
//             auto & animComp = selectActorDes.selectActor->get().GetComponent<AnimationComp>()->get();
//             animComp.ForeachState([this](AnimationState & state) {
//                 DrawNode(state);       
//             });
//             animComp.ForeachStateEvent([this](StateEvent & event) {
//                 auto & payload = event.GetDescriptor<LinkPayload>()->get();
//                 DrawLink(payload.linkID, payload.inputID, payload.outputID);
//             });
//             ed::BeginCreate();
//             ed::PinId inputPinId, outputPinId;
//             if (ed::QueryNewLink(&inputPinId, &outputPinId)) {
//                 if (inputPinId && outputPinId) {
//                     if (ed::AcceptNewItem()) {
//                         AnimationState * inputState{nullptr};
//                         AnimationState * outputState{nullptr};
//                         animComp.ForeachState([&](AnimationState & state) {
//                             auto & nodePayload = state.GetDescriptor<NodePayload>()->get();
//                             if (nodePayload.inputID == outputPinId.Get()) inputState = &state;
//                             if (nodePayload.outputID == inputPinId.Get()) outputState = &state;
//                         }); 
//                         animComp.CreateStateEvent<LinkPayload>(*outputState, *inputState, outputPinId.Get(), inputPinId.Get());
//                     }
//                 }
//             }
//             ed::EndCreate();
//             ed::BeginDelete();
//             ed::LinkId deletedLinkId;
//             while (ed::QueryDeletedLink(&deletedLinkId)) {
//                 if (ed::AcceptDeletedItem()) {
//                     animComp.RemoveStateEvent([=](StateEvent & e) {
//                         auto & payload = e.GetDescriptor<LinkPayload>()->get();
//                         return payload.linkID == deletedLinkId.Get();
//                     });
//                 }
//             }
//             ed::NodeId deletedNodeId;
//             while (ed::QueryDeletedNode(&deletedNodeId)) {
//                 if (ed::AcceptDeletedItem()) {
//                     animComp.RemoveState([=](AnimationState & state) {
//                         auto & nodePayload = state.GetDescriptor<NodePayload>()->get();
//                         return nodePayload.nodeID == deletedNodeId.Get();
//                     });
//                 }
//             }
//             ed::EndDelete();

//             ed::Suspend();
//             if (ed::ShowNodeContextMenu(&m_contextNodeId)) {
//                 ImGui::OpenPopup("Node Context Menu");
//             } else if (ed::ShowBackgroundContextMenu()) {
//                 ImGui::OpenPopup("Animation Menu");
//             }
//             ed::Resume();

//             ed::Suspend();
//             if (ImGui::BeginPopup("Node Context Menu")) {
//                 ImGui::EndPopup();
//             }

//             if (ImGui::BeginPopup("Animation Menu")) {
//                 if (animComp.HasEntry()) {
//                     if (ImGui::BeginMenu("Create State")) {
//                         char buf[256] = {0};
//                         if (ImGui::InputText("State Name", buf, sizeof(buf), ImGuiInputTextFlags_EnterReturnsTrue)) {
//                             animComp.CreateState<NodePayload>(buf);
//                         }
//                     ImGui::EndMenu();
//                 }
//                 } else {
//                     if (ImGui::MenuItem("Create Entry")) {
//                         animComp.CreateEntry<NodePayload>("Entry", true);
//                     }
//                 }
//                 ImGui::EndPopup();
//             }
//             ed::Resume();

//             ed::End();
//         }
        

//     }
    
//     void AnimationWidget::EndUpdate()
//     {
//         // ImGui::PopStyleVar();
//         ed::SetCurrentEditor(nullptr);
//     }
    
//     void AnimationWidget::DrawNode(AnimationState &state)
//     {
//         auto & nodePayload = state.GetDescriptor<NodePayload>()->get();
//         ed::BeginNode(nodePayload.nodeID);
//         ImGui::Text(nodePayload.title.c_str());
//         ImGui::BeginGroup();
//             ed::BeginPin(nodePayload.inputID, ed::PinKind::Input);
//                 ImGui::Text("-> From");
//             ed::EndPin();
//         ImGui::EndGroup();
//         ImGui::SameLine();
//         ImGui::BeginGroup();
//             ed::BeginPin(nodePayload.outputID, ed::PinKind::Output);
//                 ImGui::Text("To ->");
//             ed::EndPin();
//         ImGui::EndGroup();
//         ed::EndNode();
//     }

//     void AnimationWidget::DrawLink(int id, int inputId, int outputId)
//     {
//         ed::Link(id, inputId, outputId);
//     }
    
//     void AnimationWidget::OnCreate()
//     {
//         ed::BeginCreate();
//         ed::PinId inputPinId, outputPinId;
//         if (ed::QueryNewLink(&inputPinId, &outputPinId)) {
//             if (inputPinId && outputPinId) {
//                 if (ed::AcceptNewItem())
//                 {
//                     // Since we accepted new link, lets add one to our list of links.
//                     // m_Links.push_back({ ed::LinkId(uniqueId++), inputPinId, outputPinId });

//                     // Draw new link.
//                     // ed::Link(m_Links.back().Id, m_Links.back().InputId, m_Links.back().OutputId);
//                 }
//             }
//         }
//         ed::EndCreate();
//     }
// }